package cn.zhouchao.system.service.impl;

import cn.zhouchao.system.domain.Menu;
import cn.zhouchao.system.mapper.MenuMapper;
import cn.zhouchao.system.service.IMenuService;
import cn.zhouchao.basic.service.impl.BaseServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;
import java.util.stream.Collectors;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author zhouchao
 * @since 2023-03-09
 */
@Service
public class MenuServiceImpl extends BaseServiceImpl<Menu> implements IMenuService {
    @Autowired
    private MenuMapper menuMapper;

    /**
     * 上级部门
     * @return
     */
    @Override
    public List<Menu> first() {//查询所有，条件（该对象不为空（API：Objects.nonNull()），且当前对象的父级id为空，返回将符合条件的对象装入集合）
        return menuMapper.findAll().stream().filter(menu -> Objects.nonNull(menu) && null == menu.getParentId()).collect(Collectors.toList());
    }

    /**
     * 无限极树
     * @return
     */
    @Override
    public List<Menu> tree() {
        ArrayList<Menu> list = new ArrayList<>();//创建一个菜单集合，用于装父级菜单
        List<Menu> all = menuMapper.findAll();//查询出来所有菜单，便于分级
//        Map<Long, Menu> map = new HashMap<>();
        //用stream流，将查出来的所有菜单装入map,并以meum的（id作为key，menm对象作为value）
        Map<Long, Menu> map = all.stream().collect(Collectors.toMap(Menu::getId, menu -> menu));
        //通过 普通for遍历
        for (Menu m : all) {
            if (m.getParentId() ==null){
                list.add(m);
            }else {
                Menu Parentmenu = map.get(m.getParentId()); //父value,父key,
                List<Menu> children = Parentmenu.getChildren();
                if (Parentmenu != null){
                    children.add(m);//将所有遍历的符合条件的对象，装入子集合中
                }
            }
        }
        return list;
    }
}
